<?php
class FluxoVinculacao extends BaseFluxoEncaminhamentos implements InterfaceFluxo
{
    public static function getAlertsStatus($pfcid)
    {
        switch ($pfcid) {
            case PerfilComportamental::Gabinete:
                break;
                
            case PerfilComportamental::NucleoGestor:
                return array(
                        Status::Candidato_Contratado, 
                        Status::Candidato_EncaminhadoPostoTrabalho, 
                        Status::Candidato_NaoCompareceu);
                break;
                
            case PerfilComportamental::Orgao:
                break;
                
            case PerfilComportamental::Empresa:
                break;
        }
    }
    
    public static function encaminharPostoTrabalho(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('encaminharPostoTrabalho', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Candidato_EncaminhadoPostoTrabalho, $parecer);
    }
    
    public static function finalizar(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('finalizar', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Candidato_ContratacaoFinalizada, $parecer);
    }
    
    public static function candidatoNaoCompareceu(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('candidatoNaoCompareceu', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Candidato_NaoCompareceu, $parecer);
    }
    
    public static function desvinculacaoPorNaoComparecimento(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('desvinculacaoPorNaoComparecimento', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Devolucao_SolicitadaNaoComparecimento, $parecer);
    }
    
    public static function isAuthorized($operacao, CandidatoVaga $candidatoVaga, $throwExceptions = FALSE)
    {
        $vaga     = $candidatoVaga->getVaga();
        $statusid = $candidatoVaga->getStatusAtual();
        $contrato = $vaga->getContrato();
        
        global $usuario, $pfcid;
        
        if (!$contrato->podeMovimentarCandidatos()) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois o contrato não está confirmado.');
            }
            return FALSE;
        }
        
        if ($vaga->statusid != Status::Vaga_Ocupada) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois a vaga não está ocupada.');
            }
            return FALSE;
        }
        
        switch ($operacao) {
            case 'encaminharPostoTrabalho':
                if ($candidatoVaga->candidatovagaid) {
					$sql = "SELECT * FROM candidatovagahistorico
							WHERE 
								candidatovagaid = " . $candidatoVaga->candidatovagaid . " AND 
								statusid = " . Status::Candidato_EncaminhadoPostoTrabalho;
	
					if (pg_num_rows(TSqlSelect::customSelect($sql)) > 0) {
						return FALSE;
					}
					if ($pfcid == PerfilComportamental::NucleoGestor AND  
						$statusid == Status::Candidato_Contratado) {
					    return TRUE;
					}
				}
				else {
					return FALSE;
				}
	            break;
                
            case 'finalizar':
                if ($pfcid == PerfilComportamental::NucleoGestor && 
					$statusid == Status::Candidato_EncaminhadoPostoTrabalho) {
				    return TRUE;
				}
                break;
                
            case 'candidatoNaoCompareceu':
                if (
                        ($statusid == Status::Candidato_Contratado
                        OR $statusid == Status::Candidato_EncaminhadoPostoTrabalho) AND  
                    $pfcid == PerfilComportamental::NucleoGestor) {
                    return TRUE;
                }
                break;
                
            case 'desvinculacaoPorNaoComparecimento':
                if ($statusid == Status::Candidato_NaoCompareceu AND 
                $pfcid == PerfilComportamental::NucleoGestor) {
                    return TRUE;
                }
                break;
                
            case 'gerarFichaFrequencia':
			case 'gerarOficio':
				if ($pfcid == PerfilComportamental::NucleoGestor
				AND ($statusid == Status::Candidato_ContratacaoFinalizada
				    OR $statusid == Status::Candidato_Contratado
				    OR $statusid == Status::Candidato_EncaminhadoPostoTrabalho)) {
					return TRUE;
			    }
			    break;
					
			case 'cartaApresentacao':
			    if ($pfcid == PerfilComportamental::Empresa 
		        AND $statusid == Status::Candidato_Contratado) {
		            return TRUE;
		        }
				break;
				
			case 'fichaCadastral':
			    if ($usuario->isAuthorized(Operacao::RELATORIOS_EMITIRFICHACADASTRAL)
			    AND in_array($statusid, array(
			        Status::Candidato_Contratado, 
			        Status::Candidato_EncaminhadoPostoTrabalho, 
			        Status::Candidato_ContratacaoFinalizada))) {
			        return TRUE;
		        }
		        break;
        }
        if ($throwExceptions) {
            throw new Exception(self::ERRO_AUTORIZACAO);
        }
        return FALSE;
    }
}